using namespace std;

#include "Registro.h"

Registro::Registro() {
	this->campoActual = 0;
}

void* Registro::getCampo() {
	if ((unsigned int)this->campoActual == this->valores.size()){
		this->campoActual = 0;
		throw 1;
		//lanza excepcion cuando se acabaron los campos.
	}

	list<void*>::iterator it = this->valores.begin();
	//it = it + this->campoActual;
	for (int i=0;i<this->campoActual;i++) it++;

	void* valor = *it;
	this->campoActual++;
	return valor;
	}

int Registro::getCantidadCampo(){
	if ((unsigned int)this->campoActual == this->valores.size()){
		this->campoActual = 0;
		throw 1;
		//lanza excepcion cuando se acabaron los campos.
	}

	list<int>::iterator it = this->cantidad.begin();
	//it = it + this->campoActual;
	for (int i=0;i<this->campoActual;i++) it++;


	return *it;
}

int Registro::getRetSize(){
	return this->retSize;
}

list<void*>& Registro::getValores() const{
	return const_cast<list<void*>&>(this->valores);
}
list<string>& Registro::getTipos() const{
	return const_cast<list<string>&>(this->tipos);
}
list<int>& Registro::getCantidades() {
	return this->cantidad;
}
list<bool>& Registro::getClaves() const{
	return const_cast<list<bool>&>(this->claves);
}
list<string> Registro::getValoresClaves()const{
	list<string> keys;

	list<void*>::const_iterator itValores = this->valores.begin();
	list<bool>::const_iterator itClaves = this->claves.begin();

	while(itValores != this->valores.end()){
		if(*itClaves){
			string valor((char*) *itValores);
			keys.push_back(valor);
		}
		itValores++;
		itClaves++;
	}
	return const_cast<list<string>&>(keys);
}


int Registro::esBuscado(list<string> claves){
	list<string> keys = this->getValoresClaves();

	list<string>::iterator it1 = keys.begin();
	list<string>::iterator it2 = claves.begin();
	bool found = true;
	while(it1 != this->tipos.end()){
		if(*it1 != *it2){
			found = false;
			break;
		}
		it1++;
		it2++;
	}

	if(found)
		return 0;
	else
		return -1;
}

void Registro::addCampo(int valor, bool clave){
	string tipo("int");
	this->tipos.push_back(tipo);
	this->claves.push_back(clave);
	this->valores.push_back(&valor);
	this->cantidad.push_back(1);
}

void Registro::addCampo(char valor, bool clave){
	string tipo("char");
	this->tipos.push_back(tipo);
	this->claves.push_back(clave);
	this->valores.push_back(&valor);
	this->cantidad.push_back(1);
}

void Registro::addCampo(double valor, bool clave){
	string tipo("double");
	this->tipos.push_back(tipo);
	this->claves.push_back(clave);
	this->valores.push_back(&valor);
	this->cantidad.push_back(1);
}

int Registro::getTamanio(){
	return 0;
}
